"""
====================================================================
Copyright (C) 2012-2013 Eric Blond

This file is part of Neptune.

Neptune is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Neptune is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Neptune.  If not, see <http://www.gnu.org/licenses/>.
====================================================================

Created on Dec 1, 2012

@author: Eric
"""

import threading
from . import utils

#######

GLOBALS = threading.local()

#######

_LOCK = threading.Lock()
_NEXT_ID = 0
_HOOKS = []

def _call_hook(hook):
    try:
        hook()
    except Exception:
        utils.LOGGER.error('Hook raised an exception!', exc_info = True)

#######

def init_thread():
    global _NEXT_ID
    with _LOCK:
        GLOBALS.thread_id = _NEXT_ID
        _NEXT_ID += 1
        threading.Thread.name = 'Thread-%s' % GLOBALS.thread_id
        for hook in _HOOKS:
            _call_hook(hook)
        utils.LOGGER.info('Thread [%s] initialized.', threading.Thread.name)

def register(hook):
    with _LOCK:
        _HOOKS.append(hook)
        _call_hook(hook)

#######

init_thread()
